/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.base.util.JPAUtil;
import br.jm.financeiro.entity.LogSistema;
import br.jm.financeiro.entity.LogSistemaDetalhe;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.filter.Configuracao;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.sistema.eao.LogSistemaDetalheEao;
import br.jm.financeiro.sistema.eao.LogSistemaEao;
import br.jm.financeiro.sistema.eao.UsuarioEao;
import java.io.IOException;
import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 *
 * @author joao
 */
public class LoginBean implements Serializable {

    private static final long serialVersionUID = 1L;
    public static HttpSession session;
    private UsuarioEao usuarioEAO;
    private Usuario usuarioAutenticado;
    private String username;
    private String password;
    private static final Funcoes funcoes = new Funcoes();
    private String cSql;
    private static String NomUser;
    private static LogSistema selectedLogSistema;
    private static LogSistemaDetalhe selectedLogSistemaDetalhe;
    private static LogSistemaEao logSistemaEAO;
    private static LogSistemaDetalheEao logSistemaDetalheEAO;
    private static Date dDataAtual;
    private String cUsuario;
    private String cSistema;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNomUser() {
        return NomUser;
    }

    public void setNomUser(String NomUser) {
        this.NomUser = NomUser;
    }

    public Usuario getUsuarioAutenticado() {
        return usuarioAutenticado;
    }

    public void setUsuarioAutenticado(Usuario usuarioAutenticado) {
        this.usuarioAutenticado = usuarioAutenticado;
    }

    public String login() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        FacesMessage msg = null;
        String cReturn = null;
        List<Usuario> usuarioList;

        try {
            session = (HttpSession) ctx.getExternalContext().getSession(true);

            // COLOCAR NO FINAL O PATH
            Configuracao configuracao = new Configuracao();
            configuracao.gravaObjeto();

            /*
             // GUARDAR PARA FUTURAS PESQUISAS
            
             Enumeration e = session.getAttributeNames();
             while (e.hasMoreElements()) {
             String attr = (String) e.nextElement();
             System.err.println(" attr = " + attr);
             Object value = session.getValue(attr);
             System.err.println(" value = " + value);
             }
             */
            usuarioEAO = UsuarioEao.getInstance();

            password = funcoes.criptografaSenha(password);

            cSql = "from Usuario as o where o.usrName = '" + username + "' and o.usrPassword = '" + password + "'";

            usuarioList = usuarioEAO.get(cSql);

            usuarioAutenticado = usuarioList.get(0);

            if (usuarioAutenticado != null) {
                if (usuarioAutenticado.getTipStatus().equals("Desativado")) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... USUÁRIO DESATIVADO!", username);
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bem Vindo", username);

                    setNomUser(usuarioAutenticado.getNomUsuario());

                    //session.setMaxInactiveInterval(30 * 60);
                    session.setAttribute("usuarioAutenticado", usuarioAutenticado);
                    session.setAttribute("nomUser", usuarioAutenticado.getNomUsuario());

                    // DELETA OS ULTIMOS 30 DIAS DO LOG
                    if (logSistemaEAO == null) {
                        logSistemaEAO = LogSistemaEao.getInstance();
                    }
                    String cFiltro = " dat_update < (CURRENT_DATE - INTERVAL '30 DAYS') ";
                    List<LogSistema> dataLog = new ArrayList<>();
                    dataLog = logSistemaEAO.getNative("LogSistema", 0, logSistemaEAO.getCount("LogSistema"), null, false, null, null, cFiltro);
                    if (!dataLog.isEmpty()) {
                        for (LogSistema dataLog1 : dataLog) {
                            logSistemaEAO.destroy(dataLog1);
                        }
                    }
                    this.cUsuario = "Entrada no Sistema Usuario: ".concat(session.getAttribute("nomUser").toString());
                    this.cSistema = "";
                    AtualizaLog(cUsuario, cSistema);
                    ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/home.jsf");
                    //cReturn = "home";

                }
            } else {
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de Login", "Credenciais Inválidas");
            }

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de Login", "Credenciais Inválidas");

        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        return cReturn;
    }

    public String loginInicio() throws IOException {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/administrativo/logsistema.jsf");

        return null;
    }

    public String loginInicio2() throws IOException {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + "/index.jsp");

        return null;
    }

    public String encerraSessao() {
        JPAUtil.destruirFabrica();
        FacesContext ctx = FacesContext.getCurrentInstance();
        session = (HttpSession) ctx.getExternalContext().getSession(false);
        session.setAttribute("usuarioAutenticado", null);

        session.invalidate();
        return null;
    }

    public static String AtualizaLog(String cUsuario, String cSistema) throws EaoException {
        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpSession sessionLog = null;
        dDataAtual = new Date();
        String cNomUser;
        try {
            sessionLog = (HttpSession) ctx.getExternalContext().getSession(false);
            cNomUser = sessionLog.getAttribute("nomUser").toString();
        } catch (Exception e) {
            cNomUser = NomUser;
        }
        if (logSistemaEAO == null) {
            logSistemaEAO = LogSistemaEao.getInstance();
        }
        if (logSistemaDetalheEAO == null) {
            logSistemaDetalheEAO = LogSistemaDetalheEao.getInstance();
        }

        String cData = "DATA: ".concat(funcoes.ConverteDateString(dDataAtual, "S")).concat(" ");
        List<LogSistemaDetalhe> listDetalhe = new ArrayList<>();

        if (!cUsuario.isEmpty()) {
            cUsuario = cData.concat(cUsuario);
        }
        if (!cSistema.isEmpty()) {
            cSistema = cData.concat(" USUÁRIO: ").concat(cNomUser).concat(" ").concat(cSistema);
        }
        // Pega Data Atual sem horas e minutos
        cData = funcoes.ConverteDateString(dDataAtual, "N");
        String cSql = "select log_sistema.id_log, log_sistema.dat_update, "
                + "log_sistema_detalhe.id_log_sistema,log_sistema_detalhe.dsc_sistema,"
                + "log_sistema_detalhe.dsc_usuario "
                + "from log_sistema inner join log_sistema_detalhe on log_sistema.id_log = log_sistema_detalhe.id_log "
                + "where to_char(log_sistema.dat_update, 'dd/mm/yyyy') = '".concat(cData).concat("' ");

        selectedLogSistema = new LogSistema();
        selectedLogSistemaDetalhe = new LogSistemaDetalhe();

        selectedLogSistema = logSistemaEAO.getNativeFiltro(cSql);
        if (selectedLogSistema == null) {
            selectedLogSistema = new LogSistema();
            selectedLogSistema.setDatUpdate(dDataAtual);

            selectedLogSistemaDetalhe.setIdLog(selectedLogSistema);
            selectedLogSistemaDetalhe.setDscUsuario(cUsuario);
            selectedLogSistemaDetalhe.setDscSistema(cSistema);

            listDetalhe.add(selectedLogSistemaDetalhe);
            selectedLogSistema.setLogSistemaDetalheList(listDetalhe);

            logSistemaEAO.create(selectedLogSistema);
        } else {
            selectedLogSistemaDetalhe.setIdLog(selectedLogSistema);
            selectedLogSistemaDetalhe.setDscUsuario(cUsuario);
            selectedLogSistemaDetalhe.setDscSistema(cSistema);

            listDetalhe = selectedLogSistema.getLogSistemaDetalheList();
            listDetalhe.add(selectedLogSistemaDetalhe);
            selectedLogSistema.setLogSistemaDetalheList(listDetalhe);

            logSistemaEAO.edit(selectedLogSistema);
        }

        return cSistema;
    }
}
